package com.yssystem.utils;

import com.yssystem.domain.Do.SysDeptDO;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class TreeDeptUtil {
    public static List<SysDeptDO> createTree(List<SysDeptDO> list, Integer parentId){
        /**
         * filter
         * 方法体：过滤出菜单集合中的 parentId = X 的所有元素     这个filter方法和js中数组的filter基本一样,e代表filter每次迭代的当前元素
         * 结果：
         *      第一次，获得父级id为0的所有元素
         *
         */
        List<SysDeptDO> tree = list.stream().filter(e-> (long)parentId == e.getParentId()).collect(Collectors.toList());
        // 查询当前parentId的所有子元素
        for (SysDeptDO t: tree) {
            // 将当前元素的id取出，用于获取子元素
            Integer id = Math.toIntExact(t.getId());
            // 获取子元素(过滤parentId等于这个元素id的所有元素)
            List<SysDeptDO> childList = list.stream().filter(e -> (long)e.getParentId() == id).collect(Collectors.toList());
            // 判断这个子元素集合是否有元素，如果有元素，说明还要接着过滤，如果没有元素，则停止递归调用。
            if(childList != null && !childList.isEmpty()){
                // 集合不为空

                // 继续调自己
                createTree(list,id);
                // 将子元素集合，加入当前元素t
                t.setChildren(childList);
            }else{
                // 集合为空，说明t已经是最底层了，停止递归，并且实际上不需要将子元素放入t,但是为了返回值为[]而非null,则加入空集合
                t.setChildren(Collections.emptyList());
            }
        }
        return tree;
    }
}
